package com.kexilo.core.common.annotation;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * 防抖注解
 * 用于防止短时间内的重复请求
 * 
 * @author Kexilo
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Debounce {
    
    /**
     * 防抖key前缀
     */
    String value() default "debounce:";
    
    /**
     * 防抖key表达式，支持SpEL
     * 例如：#request.userId + ':' + #methodName
     */
    String key() default "";
    
    /**
     * 防抖时间间隔，默认3秒
     */
    long interval() default 3;
    
    /**
     * 时间单位，默认秒
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;
    
    /**
     * 提示消息
     */
    String message() default "操作过于频繁，请稍后再试";
    
    /**
     * 防抖策略
     */
    Strategy strategy() default Strategy.USER_METHOD;
    
    /**
     * 是否在操作完成后删除防抖key
     */
    boolean deleteAfterCompletion() default true;
    
    /**
     * 防抖策略枚举
     */
    enum Strategy {
        /**
         * 基于用户和方法的防抖
         */
        USER_METHOD,
        
        /**
         * 基于IP和方法的防抖
         */
        IP_METHOD,
        
        /**
         * 基于请求参数的防抖
         */
        REQUEST_PARAMS,
        
        /**
         * 基于自定义key的防抖
         */
        CUSTOM_KEY,
        
        /**
         * 全局方法防抖（所有用户共享）
         */
        GLOBAL_METHOD
    }
}
